package com.linskating.wheat.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.linskating.wheat.model.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author LinSk
 * @description 针对表【user(用户表)】的数据库操作Service
 * @createDate 2024-10-04 11:20:53
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param userAccount   用户账户
     * @param userPassword  用户密码
     * @param checkPassword 用户二次校验密码
     * @param wheatCode     用户的麦穗编号
     * @return 注册用户的id
     */
    long userRegister(String userAccount, String userPassword, String checkPassword, String wheatCode);

    /**
     * @param userAccount  用户账户
     * @param userPassword 用户密码
     * @param request      用户登录态
     * @return 脱敏后的对象
     */
    User userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 用户注销
     *
     * @param request 用户登录态
     * @return 注销结果
     */
    int userLogout(HttpServletRequest request);

    /**
     *  返回当前登录用户信息
     * @param request 用户登录态
     * @return 登录用户信息
     */
    User currentUser(HttpServletRequest request);

    /**
     * 通过SQL根据标签查询用户
     *
     * @param tagsNameList 标签列表
     * @return 拥有所有标签列表的用户
     */
    List<User> searchUsersByAllTagsBySQL(List<String> tagsNameList, Long userId);

    /**
     * 通过内存根据标签查询用户
     * 查询tagsNameList标签列表是否都存在于用户tags字段里的标签集合
     *
     * @param tagsNameList 标签列表
     * @return 拥有所有标签列表的用户
     */
    List<User> searchUsersByAllTagsByMemory(List<String> tagsNameList, Long userId);

    /**
     * 通过SQL查询用户标签存在若干标签列表
     * 只需要用户标签存在tagsNameList列表中的一个或多个
     *
     * @param tagsNameList 标签列表
     * @return 拥有若干标签列表的用户
     */
    List<User> searchUsersBySomeTagsBySQL(List<String> tagsNameList, Long userId);

    /**
     * 通过内存查询用户标签存在若干标签列表
     *
     * @param tagsNameList 标签列表
     * @return 拥有若干标签列表的用户
     */
    List<User> searchUsersBySomeTagsByMemory(List<String> tagsNameList);

    /**
     *  判断是不是管理员
     * @param request 用户登录态
     * @return true - 不是管理员 false - 是管理员
     */
    boolean isNotAdmit(HttpServletRequest request);

    boolean isNotAdmit(User currentUser);

    /**
     * 对用户信息进行脱敏
     *
     * @param user 需要脱敏的用户
     * @return 返回脱敏后的用户
     */
    User getSafetyUser(User user);

    /**
     * 修改用户信息，仅限管理员和用户可以修改
     * @param toUpdateUser 修改之后的用户信息
     * @return 是否修改成功
     */
    int updateUserInfo(User toUpdateUser);

    /**
     *  推荐可能感兴趣的用户
     * @param thePageNum 查询第几页
     * @param pageSize 一页有多少条
     * @param userId 用户id
     * @return 可能感兴趣的用户
     */
    Page<User> recommendUsers(long thePageNum, long pageSize, long userId);

    /**
     *  根据用户tags标签匹配用户
     * @param count 匹配用户数量
     * @param currentUser 当前登录的用户
     * @return 匹配用户信息列表
     */
    List<User> matchUser(int count, User currentUser);

    /**
     *  更新用户头像
     * @param file 用户上传的头像文件
     * @param id 用户id
     * @return 存入服务器的图片地址
     */
    String updateAvatarUrl(MultipartFile file, Long id);

    /**
     *  获取唯一的WheatID
     * @return 唯一的WheatID
     */
    String getUniqueUID();
}
